cuadrado([],[]).
cuadrado([N|Resto],[C|Cola]):-C is N*N,cuadrado(Resto,Cola).
fibo(0,1).
fibo(1,1).
fibo(X,Salida):-M is X-1,N is X-2,fibo(M,Salida1),fibo(N,Salida2),Salida is Salida1+Salida2.
pertenece(X,[X|_]).
pertenece(X,[Y|Cola]):-pertenece(X,Cola).
fact(0,1).
fact(N,Salida):-N>0,T is N-1,fact(T,Sal),Salida is N*Sal.
duplica([],[]).
duplica([X|Resto],[X,X|Lista]):-duplica(Resto,Lista).
triplica([],[]).
triplica([X|Resto],[X,X,X|Lista]):-triplica(Resto,Lista).
elimina_el_k([_|Lista],1,Lista).
elimina_el_k(Lista,0,Lista).
elimina_el_k([X|Resto],N,[X|Salida]):-N>0,T is N-1,elimina_el_k(Resto,T,Salida).
n_ultimos(Lista,N,Salida):-longitud(Lista,Sal),N>0,N=<Sal,T is Sal-N,quitar_k(Lista,T,Salida).
longitud([],0).
longitud([_|Resto],Sal):-longitud(Resto,Sal1),Sal is Sal1+1.
quitar_k(Lista,0,Lista).
quitar_k([_|Cola],T,ListaSal):-K is T-1,quitar_k(Cola,K,ListaSal).
elimina(X,K,Sal):-elimina_iesimos(X,K,K,Sal).
elimina_iesimos([],_,_,[]).
elimina_iesimos([_|Resto],1,K1,Sal):-elimina_iesimos(Resto,K1,K1,Sal).
elimina_iesimos([X|Resto],K,K1,[X|Sal]):-T is K-1,elimina_iesimos(Resto,T,K1,Sal).
selec(_,[],[]).
selec(X,[X|Lista],Lista).
selec(X,[Y|Cola],[Y|Lista]):-selec(X,Cola,Lista).
sublist([],[]).
sublist([X|Resto],[X|Salida]):-encadena(Resto,_,Salida).
encadena([],[],[]).
encadena([X|Resto],L,[X|Cola]):-encadena(Resto,L,Cola).
encadena([],[Y|Salida],[Y|Cola]):-encadena([],Salida,Cola).
mete_lista(X):-asserta(alumno(X)),retract(alumno([P|Resto])),asserta(elemento(P)),asserta(alumno(Resto)),Resto=[],retract(alumno([])).
permuta([X],[X]).
permuta([X|Lista],Sal):-selecciona(X,Sal,L),permuta(Lista,L).
selecciona(X,[X|Lista],Lista).
selecciona(X,[Y|Cola],[Y|Lista]):-selecciona(X,Cola,Lista).
p(1).
p(2):-!.
p(3).
clasifica(Num,positivo):-Num>0,!.
clasifica(Num,zero):-Num==0,!.
clasifica(Num,negativo):-Num<0,!.
invierte([X|Cola],Salida):-asserta(elemento(X)),invierte(Cola,Salida).
invierte([],[X|Salida]):-retract(elemento(X)),invierte([],Salida).
invierte([],[]).
combina([X|L1],L2,Salida):-asserta(lista1(X)),combina(L1,L2,Salida).
combina([],[Y|L2],Salida):-asserta(lista2(Y)),combina([],L2,Salida).
combina([],[],Salida):-lista1(X),lista2(Y),asserta(par([X,Y])),fail.
combina([],[],Salida):-retract(lista1(X)),retract(lista2(Y)),fail.
combina([],[],[L|Salida]):-retract(par(L)),combina([],[],Salida).
combina([],[],[]).
invierteacu(L1,L2):-inversa(L1,[],L2).
inversa([],L,L).
inversa([X|L],Acum,Sal):-inversa(L,[X|Acum],Sal).